import { jwtDecode } from "jwt-decode";
import Cookies from "js-cookie";
import { layer } from "vue3-layer";
import API from "@/api/index.js";

export default {
    ACCESS_TOKEN: "ACCESS-TOKEN",
    REFRESH_TOKEN: "REFRESH-TOKEN",
    USER_DATA: "USER-DATA",
    REMBER: "rembember-me",

    saveToken(access, refresh, remember=false){
        // 解析令牌
        const accessToken = jwtDecode(access)
        const refreshToken = jwtDecode(refresh)

        if (!accessToken.is_staff){
            // 不允许访问系统
            layer.msg("权限不足", {icon: 2})
            throw new Error("权限不足")
        }

        // 获取访问令牌的有效时间(单位是秒) iat: issued at 签发时间, exp: expiration time 过期时间
        let accessDuration = accessToken.exp - refreshToken.iat - 30
        let refreshDuration = refreshToken.exp - refreshToken.iat - 30

        // 将访问令牌存储，并设置过期时间
        Cookies.set(this.ACCESS_TOKEN, access, {expires: accessDuration / (24 * 60 * 60)})

        if (remember) {
            Cookies.set(this.REFRESH_TOKEN, refresh, {expires: refreshDuration / (24 * 60 * 60)})
        }else {
            // 设置会话Cookie， 随着浏览器的关闭而销毁
            Cookies.set(this.REFRESH_TOKEN, refresh)
        }
        // 存储用户的基本信息
        let {user_id, name, tel, roleName, className} = accessToken;
        // 将数据转成 JSON 
        let jsonstr = JSON.stringify({user_id, name, tel, roleName, className}) ;
        
        jsonstr = encodeURI(jsonstr) // 对字符串进行编码，防止中文乱码
        // 进行base64编码, 存储到本地存储 localStorage 中
        localStorage.setItem(this.USER_DATA, btoa(jsonstr)) ;
        // 存储记住我状态
        localStorage.setItem(this.REMBER, remember)
        
    },
    getCurrentUser(){
        let data = localStorage.getItem(this.USER_DATA)
        if (data == null){
            // 如果没有数据，返回空对象
            return {}
        }
        // 使用base64解码
        let jsonstr = decodeURI(atob(data))
        // 转成 JSON 对象
        return JSON.parse(jsonstr)

    },
    existsRefreshToken(){
        // 获取刷新令牌
        let refreshToken = Cookies.get(this.REFRESH_TOKEN)
        // 判断是否存在刷新令牌
        return refreshToken != null
    },
    // 使用async 异步函数
    async getAccessToken(){
        // 获取刷新令牌
        let refreshToken = Cookies.get(this.REFRESH_TOKEN)
        // 判断是否存在刷新令牌,如果不存在，删除访问令牌
        if (refreshToken == null){
            Cookies.remove(this.ACCESS_TOKEN)
            return null
        }
        // 如果刷新令牌存在，则获取访问令牌
        let accessToken = Cookies.get(this.ACCESS_TOKEN)
        if (accessToken != null){
            return accessToken
        }
        try {
                    // 如果访问令牌不存在，则使用刷新令牌 换取 访问令牌
        let {access, refresh}  = await API.getAccessToken(refreshToken)
        // 获取remember-me的状态
        let rembemberStr = localStorage.getItem(this.REMBER)
        // 存储两个令牌
        this.saveToken(access, refresh, rembemberStr === "true")

        return access
        }catch(e) {
            return null
        }
   

    }
}